<!--{
	"Title": "Go 1.18 Release Notes",
	"Path":  "/doc/go1.18"
}-->

<!--
NOTE: In this document and others in this directory, the convention is to
set fixed-width phrases with non-fixed-width spaces, as in
<code>hello</code> <code>world</code>.
Do not send CLs removing the interior tags from such phrases.
-->

<style>
  main ul li { margin: 0.5em 0; }
</style>

<h2 id="introduction">DRAFT RELEASE NOTES — Introduction to Go 1.18</h2>

<p>
  <strong>
    Go 1.18 is not yet released. These are work-in-progress
    release notes. Go 1.18 is expected to be released in February 2022.
  </strong>
</p>

<h2 id="language">Changes to the language</h2>

<p>
  TODO: complete this section
</p>

<h2 id="ports">Ports</h2>

<h3 id="freebsd">FreeBSD</h3>

<p>
  Go 1.18 is the last release that is supported on FreeBSD 11.x, which has
  already reached end-of-life. Go 1.19 will require FreeBSD 12.2+ or FreeBSD
  13.0+.
  FreeBSD 13.0+ will require a kernel with the COMPAT_FREEBSD12 option set (this is the default).
</p>

<h3 id="ppc64">PPC64</h3>

<p><!-- CL 353969 -->
  TODO: <a href="https://golang.org/cl/353969">https://golang.org/cl/353969</a>: internal/buildcfg: enable register ABI for PPC64
</p>

<h3 id="riscv">RISC-V</h3>

<p><!-- golang.org/issue/47100, CL 334872 -->
  The 64-bit RISC-V architecture on Linux (the <code>linux/riscv64</code> port)
  now supports the <code>c-archive</code> and <code>c-shared</code> build modes.
</p>

<h2 id="tools">Tools</h2>

<h3 id="go-command">Go command</h3>

<p><!-- golang.org/issue/43684 -->
  <code>go</code> <code>get</code> no longer builds or installs packages in
  module-aware mode. <code>go</code> <code>get</code> is now dedicated to
  adjusting dependencies in <code>go.mod</code>. Effectively, the
  <code>-d</code> flag is always enabled. To install the latest version
  of an executable outside the context of the current module, use
  <a href="https://golang.org/ref/mod#go-install"><code>go</code>
  <code>install</code> <code>example.com/cmd@latest</code></a>. Any
  <a href="https://golang.org/ref/mod#version-queries">version query</a>
  may be used instead of <code>latest</code>. This form of <code>go</code>
  <code>install</code> was added in Go 1.16, so projects supporting older
  versions may need to provide install instructions for both <code>go</code>
  <code>install</code> and <code>go</code> <code>get</code>. <code>go</code>
  <code>get</code> now reports an error when used outside a module, since there
  is no <code>go.mod</code> file to update. In GOPATH mode (with
  <code>GO111MODULE=off</code>), <code>go</code> <code>get</code> still builds
  and installs packages, as before.
</p>

<p><!-- golang.org/issue/37475 -->
  The <code>go</code> command now embeds version control information in
  binaries including the currently checked-out revision, commit time, and a
  flag indicating whether edited or untracked files are present. Version
  control information is embedded if the <code>go</code> command is invoked in
  a directory within a Git, Mercurial, Fossil, or Bazaar repository, and the
  <code>main</code> package and its containing main module are in the same
  repository. This information may be omitted using the flag
  <code>-buildvcs=false</code>.
</p>

<p><!-- golang.org/issue/37475 -->
  Additionally, the <code>go</code> command embeds information about the build
  including build and tool tags (set with <code>-tags</code>), compiler,
  assembler, and linker flags (like <code>-gcflags</code>), whether cgo was
  enabled, and if it was, the values of the cgo environment variables
  (like <code>CGO_CFLAGS</code>). This information may be omitted using the
  flag <code>-buildinfo=false</code>. Both VCS and build information may be
  read together with module information using <code>go</code>
  <code>version</code> <code>-m</code> <code>file</code> or
  <code>runtime/debug.ReadBuildInfo</code> (for the currently running binary)
  or the new <a href="#debug/buildinfo"><code>debug/buildinfo</code></a>
  package.
</p>

<p><!-- https://golang.org/issue/44435 -->
  If the main module's <code>go.mod</code> file
  specifies <a href="/ref/mod#go-mod-file-go"><code>go</code> <code>1.17</code></a>
  or higher, <code>go</code> <code>mod</code> <code>download</code> without
  arguments now downloads source code for only the modules
  explicitly <a href="/ref/mod#go-mod-file-require">required</a> in the main
  module's <code>go.mod</code> file. (In a <code>go</code> <code>1.17</code> or
  higher module, that set already includes all dependencies needed to build the
  packages and tests in the main module.)
  To also download source code for transitive dependencies, use
  <code>go</code> <code>mod</code> <code>download</code> <code>all</code>.
</p>

<p><!-- https://golang.org/issue/47327 -->
  The <code>go</code> <code>mod</code> <code>vendor</code> subcommand now
  supports a <code>-o</code> flag to set the output directory.
  (Other <code>go</code> commands still read from the <code>vendor</code>
  directory at the module root when loading packages
  with <code>-mod=vendor</code>, so the main use for this flag is for
  third-party tools that need to collect package source code.)
</p>

<p><!-- CL 349595 -->
  TODO: <a href="https://golang.org/cl/349595">https://golang.org/cl/349595</a>: cmd/go: add GOAMD64 environment variable
</p>

<h3 id="gofmt"><code>gofmt</code></h3>

<p><!-- https://golang.org/issue/43566 -->
  <code>gofmt</code> now reads and formats input files concurrently, with a
  memory limit proportional to <code>GOMAXPROCS</code>. On a machine with
  multiple CPUs, <code>gofmt</code> should now be significantly faster.
</p>

<h2 id="runtime">Runtime</h2>

<p>
  TODO: complete this section, or delete if not needed
</p>

<h2 id="compiler">Compiler</h2>

<p><!-- CL 298611 -->
  TODO: <a href="https://golang.org/cl/298611">https://golang.org/cl/298611</a>: cmd/compile: add -asan option
</p>

<p><!-- CL 352057 -->
  TODO: <a href="https://golang.org/cl/352057">https://golang.org/cl/352057</a>: cmd/compile, runtime: track argument stack slot liveness
</p>

<h2 id="linker">Linker</h2>

<p><!-- CL 298610 -->
  TODO: <a href="https://golang.org/cl/298610">https://golang.org/cl/298610</a>: cmd/link: add -asan option
</p>

<h2 id="library">Core library</h2>

<h3 id="constraints">New <code>constraints</code> package</h3>

<p><!-- CL 349709 -->
  TODO: <a href="https://golang.org/cl/349709">https://golang.org/cl/349709</a>: constraints: new package
</p>

<h3 id="netip">New <code>net/netip</code> package</h3>

<p>
  The new <a href="/pkg/net/netip/"><code>net/netip</code></a>
  package defines a new IP address type, <a href="/pkg/net/netip/#Addr"><code>Addr</code></a>.
  Compared to the existing
  <a href="/pkg/net/#IP"><code>net.IP</code></a> type, the <code>netip.Addr</code> type takes less
  memory, is immutable, and is comparable so it supports <code>==</code>
  and can be used as a map key.
</p>
<p>
  In addition to <code>Addr</code>, the package defines
  <a href="/pkg/net/netip/#AddrPort"><code>AddrPort</code></a>, representing
  an IP and port, and
  <a href="/pkg/net/netip/#Prefix"><code>Prefix</code></a>, representing
  a network CIDR prefix.
</p>
<p>
  The <code>net</code> package now has methods to send and receive UDP packets
  using <code>netip.Addr</code> values instead of the relatively heavy
  <code>*net.UDPAddr</code> values.
</p>

<h3>TODO</h3>

<p>
  TODO: complete this section
</p>

<h3 id="minor_library_changes">Minor changes to the library</h3>

<p>
  As always, there are various minor changes and updates to the library,
  made with the Go 1 <a href="/doc/go1compat">promise of compatibility</a>
  in mind.
</p>

<p>
  TODO: complete this section
</p>

<dl id="bufio"><dt><a href="/pkg/bufio/">bufio</a></dt>
  <dd>
    <p><!-- CL 345569 -->
      TODO: <a href="https://golang.org/cl/345569">https://golang.org/cl/345569</a>: add Writer.AvailableBuffer
    </p>

    <p><!-- CL 345570 -->
      TODO: <a href="https://golang.org/cl/345570">https://golang.org/cl/345570</a>: make Reader.Reset and Writer.Reset work on the zero value
    </p>
  </dd>
</dl><!-- bufio -->

<dl id="bytes"><dt><a href="/pkg/bytes/">bytes</a></dt>
  <dd>
    <p><!-- CL 332771 -->
      TODO: <a href="https://golang.org/cl/332771">https://golang.org/cl/332771</a>: avoid allocations in Trim/TrimLeft/TrimRight
    </p>

    <p><!-- CL 359485 -->
      The <a href="/pkg/bytes/#Title"><code>Title</code></a> function is now deprecated. It doesn't
      handle Unicode punctuation and language-specific capitalization rules, and is superseded by the
      <a href="https://golang.org/x/text/cases">golang.org/x/text/cases</a> package.
    </p>
  </dd>
</dl><!-- bytes -->

<dl id="crypto/tls"><dt><a href="/pkg/crypto/tls/">crypto/tls</a></dt>
  <dd>
    <p><!-- CL 325250 -->
      TODO: <a href="https://golang.org/cl/325250">https://golang.org/cl/325250</a>: add Conn.NetConn method
    </p>
  </dd>
</dl><!-- crypto/tls -->

<dl id="debug/buildinfo"><dt><a href="/pkg/debug/buildinfo">debug/buildinfo</a></dt>
  <dd>
    <p><!-- golang.org/issue/39301 -->
      This new package provides access to module versions, version control
      information, and build flags embedded in executable files built by
      the <code>go</code> command. The same information is also available via
      <a href="/pkg/runtime/debug#ReadBuildInfo"><code>runtime/debug.ReadBuildInfo</code></a>
      for the currently running binary and via <code>go</code>
      <code>version</code> <code>-m</code> on the command line.
    </p>
  </dd>
</dl>

<dl id="image/draw"><dt><a href="/pkg/image/draw/">image/draw</a></dt>
  <dd>
    <p><!-- CL 340049 -->
      The <code>Draw</code> and <code>DrawMask</code> fallback implementations
      (used when the arguments are not the most common image types) are now
      faster when those arguments implement the optional
      <a href="/pkg/image/draw/#RGBA64Image"><code>draw.RGBA64Image</code></a>
      and <a href="/pkg/image/#RGBA64Image"><code>image.RGBA64Image</code></a>
      interfaces that were added in Go 1.17.
    </p>
  </dd>
</dl><!-- image/draw -->

<dl id="net"><dt><a href="/pkg/net/">net</a></dt>
  <dd>
    <p><!-- CL 340261 -->
      TODO: <a href="https://golang.org/cl/340261">https://golang.org/cl/340261</a>: deprecate (net.Error).Temporary
    </p>
  </dd>
</dl><!-- net -->

<dl id="net/http"><dt><a href="/pkg/net/http/">net/http</a></dt>
  <dd>
    <p><!-- CL 330852 -->
      On WebAssembly targets, the <code>Dial</code>, <code>DialContext</code>,
      <code>DialTLS</code> and <code>DialTLSContext</code> method fields in
      <a href="/pkg/net/http/#Transport"><code>Transport</code></a>
      will now be correctly used, if specified, for making HTTP requests.
    </p>
    <p><!-- CL 338590 -->
      TODO: <a href="https://golang.org/cl/338590">https://golang.org/cl/338590</a>: add Cookie.Valid method
    </p>
  </dd>
</dl><!-- net/http -->

<dl id="os/user"><dt><a href="/pkg/os/user/">os/user</a></dt>
  <dd>
    <p><!-- CL 330753 -->
      TODO: <a href="https://golang.org/cl/330753">https://golang.org/cl/330753</a>: implement go native GroupIds
    </p>
  </dd>
</dl><!-- os/user -->

<dl id="reflect"><dt><a href="/pkg/reflect/">reflect</a></dt>
  <dd>
    <p><!-- CL 356049, CL 320929 -->
      The new
      <a href="/pkg/reflect/#Value.SetIterKey"><code>Value.SetIterKey</code></a>
      and <a href="/pkg/reflect/#Value.SetIterValue"><code>Value.SetIterValue</code></a>
      methods set a Value using a map iterator as the source. They are equivalent to
      <code>Value.Set(iter.Key())</code> and <code>Value.Set(iter.Value())</code> but
      do fewer allocations.
    </p>

    <p><!-- CL 350691 -->
      The new
      <a href="/pkg/reflect/#Value.UnsafePointer"><code>Value.UnsafePointer</code></a>
      method returns the Value's value as an <a href="/pkg/unsafe/#Pointer"><code>unsafe.Pointer</code></a>.
      This allows callers to migrate from <a href="/pkg/reflect/#Value.UnsafeAddr"><code>Value.UnsafeAddr</code></a>
      and <a href="/pkg/reflect/#Value.Pointer"><code>Value.Pointer</code></a>
      to eliminate the need to perform uintptr to unsafe.Pointer conversions at the callsite (as unsafe.Pointer rules require).
    </p>

    <p><!-- CL 321889 -->
      TODO: <a href="https://golang.org/cl/321889">https://golang.org/cl/321889</a>: allocate hiter as part of MapIter
    </p>

    <p><!-- CL 321891 -->
      TODO: <a href="https://golang.org/cl/321891">https://golang.org/cl/321891</a>: add MapIter.Reset
    </p>

    <p><!-- CL 345486 -->
      TODO: <a href="https://golang.org/cl/345486">https://golang.org/cl/345486</a>: optimize for maps with string keys
    </p>

    <p><!-- CL 352131 -->
      TODO: <a href="https://golang.org/cl/352131">https://golang.org/cl/352131</a>: add Value.{CanInt, CanUint, CanFloat, CanComplex}
    </p>

    <p><!-- CL 357962 -->
      TODO: <a href="https://golang.org/cl/357962">https://golang.org/cl/357962</a>: add FieldByIndexErr
    </p>
  </dd>
</dl><!-- reflect -->

<dl id="regexp"><dt><a href="/pkg/regexp/">regexp</a></dt>
  <dd>
    <p><!-- CL 354569 -->
      TODO: <a href="https://golang.org/cl/354569">https://golang.org/cl/354569</a>: document and implement that invalid UTF-8 bytes are the same as U+FFFD
    </p>
  </dd>
</dl><!-- regexp -->

<dl id="strconv"><dt><a href="/pkg/strconv/">strconv</a></dt>
  <dd>
    <p><!-- CL 343877 -->
      TODO: <a href="https://golang.org/cl/343877">https://golang.org/cl/343877</a>: reject surrogate halves in Unquote
    </p>
  </dd>
</dl><!-- strconv -->

<dl id="strings"><dt><a href="/pkg/strings/">strings</a></dt>
  <dd>
    <p><!-- CL 345849 -->
      TODO: <a href="https://golang.org/cl/345849">https://golang.org/cl/345849</a>: add Clone function
    </p>

    <p><!-- CL 332771 -->
      TODO: <a href="https://golang.org/cl/332771">https://golang.org/cl/332771</a>: avoid allocations in Trim/TrimLeft/TrimRight
    </p>

    <p><!-- CL 359485 -->
      The <a href="/pkg/strings/#Title"><code>Title</code></a> function is now deprecated. It doesn't
      handle Unicode punctuation and language-specific capitalization rules, and is superseded by the
      <a href="https://golang.org/x/text/cases">golang.org/x/text/cases</a> package.
    </p>
  </dd>
</dl><!-- strings -->

<dl id="sync"><dt><a href="/pkg/sync/">sync</a></dt>
  <dd>
    <p><!-- CL 319769 -->
      TODO: <a href="https://golang.org/cl/319769">https://golang.org/cl/319769</a>: add Mutex.TryLock, RWMutex.TryLock, RWMutex.TryRLock
    </p>
  </dd>
</dl><!-- sync -->

<dl id="syscall"><dt><a href="/pkg/syscall/">syscall</a></dt>
  <dd>
    <p><!-- CL 336550 -->
      The new function <a href="/pkg/syscall/?GOOS=windows#SyscallN"><code>SyscallN</code></a>
      has been introduced for Windows, allowing for calls with arbitrary number
      of arguments. As a result,
      <a href="/pkg/syscall/?GOOS=windows#Syscall"><code>Syscall</code></a>,
      <a href="/pkg/syscall/?GOOS=windows#Syscall6"><code>Syscall6</code></a>,
      <a href="/pkg/syscall/?GOOS=windows#Syscall9"><code>Syscall9</code></a>,
      <a href="/pkg/syscall/?GOOS=windows#Syscall12"><code>Syscall12</code></a>,
      <a href="/pkg/syscall/?GOOS=windows#Syscall15"><code>Syscall15</code></a>, and
      <a href="/pkg/syscall/?GOOS=windows#Syscall18"><code>Syscall18</code></a> are
      deprecated in favor of <a href="/pkg/syscall/?GOOS=windows#SyscallN"><code>SyscallN</code></a>.
    </p>

    <p><!-- CL 355570 -->
      TODO: <a href="https://golang.org/cl/355570">https://golang.org/cl/355570</a>: add support for SysProcAttr.Pdeathsig on FreeBSD
    </p>
  </dd>
</dl><!-- syscall -->

<dl id="syscall/js"><dt><a href="/pkg/syscall/js/">syscall/js</a></dt>
  <dd>
    <p><!-- CL 356430 -->
      TODO: <a href="https://golang.org/cl/356430">https://golang.org/cl/356430</a>: remove Wrapper interface
    </p>
  </dd>
</dl><!-- syscall/js -->

<dl id="testing"><dt><a href="/pkg/testing/">testing</a></dt>
  <dd>
    <p><!-- CL 343883 -->
      TODO: <a href="https://golang.org/cl/343883">https://golang.org/cl/343883</a>: increase alternation precedence
    </p>

    <p><!-- CL 356669 -->
      TODO: <a href="https://golang.org/cl/356669">https://golang.org/cl/356669</a>: skip extra -count iterations if there are no tests
    </p>
  </dd>
</dl><!-- testing -->

<dl id="text/template"><dt><a href="/pkg/text/template/">text/template</a></dt>
  <dd>
    <p><!-- CL 321490 -->
      TODO: <a href="https://golang.org/cl/321490">https://golang.org/cl/321490</a>: implement short-circuit and, or
    </p>
  </dd>
</dl><!-- text/template -->

<dl id="unicode/utf8"><dt><a href="/pkg/unicode/utf8/">unicode/utf8</a></dt>
  <dd>
    <p><!-- CL 345571 -->
      TODO: <a href="https://golang.org/cl/345571">https://golang.org/cl/345571</a>: add AppendRune
    </p>
  </dd>
</dl><!-- unicode/utf8 -->
